home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Borland / Borland C++ V5.02 / CATALG.PAK / COLUMNST.CPP < prev    next >
C/C++ Source or Header  |  1997-05-06  |  4KB  |  152 lines

  1. // sqlcols.cpp: implementation of the CColumns class
  2. //
  3. // This is a part of the Microsoft Foundation Classes C++ library.
  4. // Copyright (C) 1992-1995 Microsoft Corporation
  5. // All rights reserved.
  6. //
  7. // This source code is only intended as a supplement to the
  8. // Microsoft Foundation Classes Reference and related
  9. // electronic documentation provided with the library.
  10. // See these sources for detailed information regarding the
  11. // Microsoft Foundation Classes product.
  12.  
  13.  
  14. #include "stdafx.h"
  15. #include "columnst.h"
  16.  
  17. /////////////////////////////////////////////////////////////////////////////
  18. // CColumns implementation
  19.  
  20. IMPLEMENT_DYNAMIC(CColumns, CRecordset)
  21.  
  22. CColumns::CColumns(CDatabase* pDatabase)
  23.     : CRecordset(pDatabase)
  24. {
  25.     //{{AFX_FIELD_INIT(CColumns)
  26.     m_strQualifier = "";
  27.     m_strOwner = "";
  28.     m_strTableName = "";
  29.     m_strColumnName = "";
  30.     m_nDataType = 0;
  31.     m_strTypeName = "";
  32.     m_lPrecision = 0;
  33.     m_lLength = 0;
  34.     m_nScale = 0;
  35.     m_nRadix = 0;
  36.     m_nFields = 11;
  37.     //}}AFX_FIELD_INIT
  38.     m_strQualifierParam = "";
  39.     m_strOwnerParam = "";
  40.     m_strTableNameParam = "";
  41.     m_strColumnNameParam = "";
  42. }
  43.  
  44. BOOL CColumns::Open(UINT nOpenType /* = snapshot */,
  45.     LPCSTR lpszSQL /* = NULL */, DWORD dwOptions /* = none */)
  46. {
  47.     RETCODE nRetCode;
  48.     ASSERT(lpszSQL == NULL);
  49.  
  50.     nOpenType;  // not used in release build
  51.     dwOptions;
  52.     lpszSQL;
  53.  
  54.     // Allocation and opening of database not supported
  55.     if (m_hstmt == SQL_NULL_HSTMT)
  56.     {
  57.         CString strDefaultConnect;
  58.         TRY
  59.         {
  60.             if (m_pDatabase == NULL)
  61.             {
  62.                 m_pDatabase = new CDatabase();
  63.                 m_bRecordsetDb = TRUE;
  64.             }
  65.  
  66.             strDefaultConnect = GetDefaultConnect();
  67.             // If not already opened, attempt to open
  68.             if (!m_pDatabase->IsOpen() &&
  69.                 !m_pDatabase->Open("", FALSE, FALSE, strDefaultConnect))
  70.                 return FALSE;
  71.  
  72.             AFX_SQL_SYNC(::SQLAllocStmt(m_pDatabase->m_hdbc, &m_hstmt));
  73.             if (!Check(nRetCode))
  74.                 ThrowDBException(SQL_INVALID_HANDLE);
  75.         }
  76.         CATCH_ALL(e)
  77.         {
  78. #ifdef _DEBUG
  79.             if (afxTraceFlags & 0x20)
  80.                 TRACE0("Error: CDatabase create for CRecordset failed\n");
  81. #endif // _DEBUG
  82.             strDefaultConnect.Empty();
  83.             if (m_bRecordsetDb)
  84.             {
  85.                 delete m_pDatabase;
  86.                 m_pDatabase = NULL;
  87.             }
  88.             ASSERT(m_hstmt == SQL_NULL_HSTMT);
  89.             THROW_LAST();
  90.         }
  91.         END_CATCH_ALL
  92.     }
  93.  
  94.     TRY
  95.     {
  96.         // set any options, like timeouts, scrolling options
  97.         OnSetOptions(m_hstmt);
  98.  
  99.         // call the ODBC catalog function with data member params
  100.         RETCODE nRetCode;
  101.         AFX_SQL_ASYNC(this, ::SQLColumns(m_hstmt,
  102.             (m_strQualifierParam.IsEmpty()? (UCHAR FAR *)NULL: (UCHAR FAR *)(const char*)m_strQualifierParam), SQL_NTS,
  103.             (m_strOwnerParam.IsEmpty()? (UCHAR FAR *)NULL: (UCHAR FAR *)(const char*)m_strOwnerParam), SQL_NTS,
  104.             (m_strTableNameParam.IsEmpty()? (UCHAR FAR *)NULL: (UCHAR FAR *)(const char*)m_strTableNameParam), SQL_NTS,
  105.             NULL, SQL_NTS));
  106.         if (!Check(nRetCode))
  107.         {
  108.             AfxThrowDBException(nRetCode, m_pDatabase, m_hstmt);
  109.         }
  110.         // load first record
  111.         MoveFirst();
  112.     }
  113.     CATCH_ALL(e)
  114.     {
  115.         Close();
  116.         THROW_LAST();
  117.     }
  118.     END_CATCH_ALL
  119.     return TRUE;
  120. }
  121.  
  122. CString CColumns::GetDefaultConnect()
  123. {
  124.     // this minimal connect string will cause ODBC login dialog to be brought up
  125.     return "ODBC;";
  126. }
  127.  
  128. CString CColumns::GetDefaultSQL()
  129. {
  130.     // there is no default SQL - a direct ODBC call is made instead
  131.     ASSERT(FALSE);
  132.     return "!";
  133. }
  134.  
  135. void CColumns::DoFieldExchange(CFieldExchange* pFX)
  136. {
  137.     //{{AFX_FIELD_MAP(CColumns)
  138.     pFX->SetFieldType(CFieldExchange::outputColumn);
  139.     RFX_Text(pFX, "table_qualifier", m_strQualifier);
  140.     RFX_Text(pFX, "table_owner", m_strOwner);
  141.     RFX_Text(pFX, "table_name", m_strTableName);
  142.     RFX_Text(pFX, "column_name", m_strColumnName);
  143.     RFX_Int(pFX, "data_type", m_nDataType);
  144.     RFX_Text(pFX, "type_name", m_strTypeName);
  145.     RFX_Long(pFX, "precision", m_lPrecision);
  146.     RFX_Long(pFX, "length", m_lLength);
  147.     RFX_Int(pFX, "scale", m_nScale);
  148.     RFX_Int(pFX, "radix", m_nRadix);
  149.     RFX_Int(pFX, "nullable", m_nNullable);
  150.     //}}AFX_FIELD_MAP
  151. }
  152.